<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- qsgrendernode.cpp -->
  <title>QSGRenderNode 类 | Qt Quick 5.12.3</title>
  <link rel="stylesheet" type="text/css" href="style/offline-simple.css" />
  <script type="text/javascript">
    document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css");
    // loading style sheet breaks anchors that were jumped to before
    // so force jumping to anchor again
    setTimeout(function() {
        var anchor = location.hash;
        // need to jump to different anchor first (e.g. none)
        location.hash = "#";
        setTimeout(function() {
            location.hash = anchor;
        }, 0);
    }, 0);
  </script>
</head>
<body>
<div class="header" id="qtdocheader">
  <div class="main">
    <div class="main-rounded">
      <div class="navigationbar">
        <table><tr>
<td ><a href="../qtdoc/index.html">Qt 5.12</a></td><td ><a href="qtquick-index.html">Qt Quick 模块</a></td><td ><a href="qtquick-module.html">C++ 类</a></td><td >QSGRenderNode</td></tr></table><table class="buildversion"><tr>
<td id="buildversion" width="100%" align="right"><a href="qtquick-index.html">Qt 5.12.3 参考指南</a></td>
        </tr></table>
      </div>
    </div>
<div class="content">
<div class="line">
<div class="content mainContent">
<div class="sidebar">
<div class="toc">
<h3><a name="toc">目录</a></h3>
<ul>
<li class="level1"><a href="#public-types">公用类型</a></li>
<li class="level1"><a href="#public-functions">公用函数</a></li>
<li class="level1"><a href="#details">详细信息</a></li>
</ul>
</div>
<div class="sidebar-content" id="sidebar-content"></div></div>
<h1 class="title">QSGRenderNode 类</h1>
<!-- $$$QSGRenderNode-brief -->
<p>The <a href="qsgrendernode.html">QSGRenderNode</a> class represents a set of custom rendering commands targeting the graphics API that is in use by the scenegraph. <a href="#details">更多...</a></p>
<!-- @@@QSGRenderNode -->
<div class="table"><table class="alignedsummary">
<tr><td class="memItemLeft rightAlign topAlign">头文件：</td><td class="memItemRight bottomAlign">   <span class="preprocessor">#include &lt;QSGRenderNode&gt;</span>
</td></tr><tr><td class="memItemLeft rightAlign topAlign"> qmake:</td><td class="memItemRight bottomAlign"> QT += quick</td></tr><tr><td class="memItemLeft rightAlign topAlign"> Since:</td><td class="memItemRight bottomAlign">  Qt 5.8</td></tr><tr><td class="memItemLeft rightAlign topAlign">继承自：</td><td class="memItemRight bottomAlign"> <a href="qsgnode.html">QSGNode</a></td></tr></table></div><ul>
<li><a href="qsgrendernode-members.html">所有成员的列表，包括继承成员</a></li>
</ul>
<a name="public-types"></a>
<h2 id="public-types">公用类型</h2>
<div class="table"><table class="alignedsummary">
<tr><td class="memItemLeft rightAlign topAlign"> class </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode-renderstate.html">RenderState</a></b></td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> enum </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#RenderingFlag-enum">RenderingFlag</a></b> { BoundedRectRendering, DepthAwareRendering, OpaqueRendering }</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> flags </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#RenderingFlag-enum">RenderingFlags</a></b></td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> enum </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#StateFlag-enum">StateFlag</a></b> { DepthState, StencilState, ScissorState, ColorState, ..., RenderTargetState }</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> flags </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#StateFlag-enum">StateFlags</a></b></td></tr>
</table></div>
<a name="public-functions"></a>
<h2 id="public-functions">公用函数</h2>
<div class="table"><table class="alignedsummary">
<tr><td class="memItemLeft rightAlign topAlign"> </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#QSGRenderNode">QSGRenderNode</a></b>()</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> virtual </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#dtor.QSGRenderNode">~QSGRenderNode</a></b>() override</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> virtual QSGRenderNode::StateFlags </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#changedStates">changedStates</a></b>() const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> const QSGClipNode *</td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#clipList">clipList</a></b>() const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> virtual QSGRenderNode::RenderingFlags </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#flags">flags</a></b>() const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> qreal </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#inheritedOpacity">inheritedOpacity</a></b>() const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> const QMatrix4x4 *</td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#matrix">matrix</a></b>() const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> virtual QRectF </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#rect">rect</a></b>() const</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> virtual void </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#releaseResources">releaseResources</a></b>()</td></tr>
<tr><td class="memItemLeft rightAlign topAlign"> virtual void </td><td class="memItemRight bottomAlign"><b><a href="qsgrendernode.html#render">render</a></b>(const QSGRenderNode::RenderState *<i>state</i>) = 0</td></tr>
</table></div>
<ul>
<li class="fn">20 个公用函数继承自<a href="qsgnode.html#public-functions">QSGNode</a></li>
</ul>
<a name="details"></a>
<!-- $$$QSGRenderNode-description -->
<div class="descr">
<h2 id="details">详细信息</h2>
<p>The <a href="qsgrendernode.html">QSGRenderNode</a> class represents a set of custom rendering commands targeting the graphics API that is in use by the scenegraph.</p>
</div>
<!-- @@@QSGRenderNode -->
<div class="types">
<h2>成员类型文档</h2>
<!-- $$$RenderingFlag$$$BoundedRectRendering$$$DepthAwareRendering$$$OpaqueRendering -->
<h3 class="flags" id="RenderingFlag-enum"><a name="RenderingFlag-enum"></a>enum QSGRenderNode::<span class="name">RenderingFlag</span><br/>flags QSGRenderNode::<span class="name">RenderingFlags</span></h3>
<p>Possible values for the bitmask returned from <a href="qsgrendernode.html#flags">flags</a>().</p>
<div class="table"><table class="valuelist"><tr valign="top" class="odd"><th class="tblConst">Constant</th><th class="tblval">Value</th><th class="tbldscr">Description</th></tr>
<tr><td class="topAlign"><code>QSGRenderNode::BoundedRectRendering</code></td><td class="topAlign tblval"><code>0x01</code></td><td class="topAlign">Indicates that the implementation of <a href="qsgrendernode.html#render">render</a>() does not render outside the area reported from <a href="qsgrendernode.html#rect">rect</a>() in item coordinates. Such node implementations can lead to more efficient rendering, depending on the scenegraph backend. For example, the software backend can continue to use the more optimal partial update path when all render nodes in the scene have this flag set.</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::DepthAwareRendering</code></td><td class="topAlign tblval"><code>0x02</code></td><td class="topAlign">Indicates that the implementations of <a href="qsgrendernode.html#render">render</a>() conforms to scenegraph expectations by only generating a Z value of 0 in scene coordinates which is then transformed by the matrices retrieved from <a href="qsgrendernode-renderstate.html#projectionMatrix">RenderState::projectionMatrix</a>() and <a href="qsgrendernode.html#matrix">matrix</a>(), as described in the notes for <a href="qsgrendernode.html#render">render</a>(). Such node implementations can lead to more efficient rendering, depending on the scenegraph backend. For example, the batching OpenGL renderer can continue to use a more optimal path when all render nodes in the scene have this flag set.</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::OpaqueRendering</code></td><td class="topAlign tblval"><code>0x04</code></td><td class="topAlign">Indicates that the implementation of <a href="qsgrendernode.html#render">render</a>() writes out opaque pixels for the entire area reported from <a href="qsgrendernode.html#rect">rect</a>(). By default the renderers must assume that <a href="qsgrendernode.html#render">render</a>() can also output semi or fully transparent pixels. Setting this flag can improve performance in some cases.</td></tr>
</table></div>
<p>The RenderingFlags type is a typedef for <a href="../qtcore/qflags.html">QFlags</a>&lt;RenderingFlag&gt;. It stores an OR combination of RenderingFlag values.</p>
<p><b>请参考 </b><a href="qsgrendernode.html#render">render</a>() 和 <a href="qsgrendernode.html#rect">rect</a>()。</p>
<!-- @@@RenderingFlag -->
<!-- $$$StateFlag$$$DepthState$$$StencilState$$$ScissorState$$$ColorState$$$BlendState$$$CullState$$$ViewportState$$$RenderTargetState -->
<h3 class="flags" id="StateFlag-enum"><a name="StateFlag-enum"></a>enum QSGRenderNode::<span class="name">StateFlag</span><br/>flags QSGRenderNode::<span class="name">StateFlags</span></h3>
<p>This enum is a bit mask identifying several states.</p>
<div class="table"><table class="valuelist"><tr valign="top" class="odd"><th class="tblConst">Constant</th><th class="tblval">Value</th><th class="tbldscr">Description</th></tr>
<tr><td class="topAlign"><code>QSGRenderNode::DepthState</code></td><td class="topAlign tblval"><code>0x01</code></td><td class="topAlign">Depth</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::StencilState</code></td><td class="topAlign tblval"><code>0x02</code></td><td class="topAlign">Stencil</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::ScissorState</code></td><td class="topAlign tblval"><code>0x04</code></td><td class="topAlign">Scissor</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::ColorState</code></td><td class="topAlign tblval"><code>0x08</code></td><td class="topAlign">Color</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::BlendState</code></td><td class="topAlign tblval"><code>0x10</code></td><td class="topAlign">Blend</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::CullState</code></td><td class="topAlign tblval"><code>0x20</code></td><td class="topAlign">Cull</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::ViewportState</code></td><td class="topAlign tblval"><code>0x40</code></td><td class="topAlign">View poirt</td></tr>
<tr><td class="topAlign"><code>QSGRenderNode::RenderTargetState</code></td><td class="topAlign tblval"><code>0x80</code></td><td class="topAlign">Render target</td></tr>
</table></div>
<p>The StateFlags type is a typedef for <a href="../qtcore/qflags.html">QFlags</a>&lt;StateFlag&gt;. It stores an OR combination of StateFlag values.</p>
<!-- @@@StateFlag -->
</div>
<div class="func">
<h2>成员函数文档</h2>
<!-- $$$QSGRenderNode[overload1]$$$QSGRenderNode -->
<h3 class="fn" id="QSGRenderNode"><a name="QSGRenderNode"></a>QSGRenderNode::<span class="name">QSGRenderNode</span>()</h3>
<p>Default constructs an instance of QSGRenderNode.</p><!-- @@@QSGRenderNode -->
<!-- $$$~QSGRenderNode[overload1]$$$~QSGRenderNode -->
<h3 class="fn" id="dtor.QSGRenderNode"><a name="dtor.QSGRenderNode"></a><code>[override virtual] </code>QSGRenderNode::<span class="name">~QSGRenderNode</span>()</h3>
<p>Destructs the render node. Derived classes are expected to perform cleanup similar to <a href="qsgrendernode.html#releaseResources">releaseResources</a>() in here.</p>
<p>When a low-level graphics API is in use, the scenegraph will make sure there is a CPU-side wait for the GPU to complete all work submitted to the scenegraph's graphics command queue before the scenegraph's nodes are deleted. Therefore there is no need to issue additional waits here, unless the <a href="qsgrendernode.html#render">render</a>() implementation is using additional command queues.</p>
<p><b>请参考 </b><a href="qsgrendernode.html#releaseResources">releaseResources</a>()。</p>
<!-- @@@~QSGRenderNode -->
<!-- $$$changedStates[overload1]$$$changedStates -->
<h3 class="fn" id="changedStates"><a name="changedStates"></a><code>[virtual] </code><span class="type"><a href="qsgrendernode.html#StateFlag-enum">QSGRenderNode::StateFlags</a></span> QSGRenderNode::<span class="name">changedStates</span>() const</h3>
<p>This function should return a mask where each bit represents graphics states changed by the <a href="qsgrendernode.html#render">render</a>() function:</p>
<ul>
<li><a href="qsgrendernode.html#StateFlag-enum">DepthState</a> - depth write mask, depth test enabled, depth comparison function</li>
<li><a href="qsgrendernode.html#StateFlag-enum">StencilState</a> - stencil write masks, stencil test enabled, stencil operations, stencil comparison functions</li>
<li><a href="qsgrendernode.html#StateFlag-enum">ScissorState</a> - scissor enabled, scissor test enabled</li>
<li><a href="qsgrendernode.html#StateFlag-enum">ColorState</a> - clear color, color write mask</li>
<li><a href="qsgrendernode.html#StateFlag-enum">BlendState</a> - blend enabled, blend function</li>
<li><a href="qsgrendernode.html#StateFlag-enum">CullState</a> - front face, cull face enabled</li>
<li><a href="qsgrendernode.html#StateFlag-enum">ViewportState</a> - viewport</li>
<li><a href="qsgrendernode.html#StateFlag-enum">RenderTargetState</a> - render target</li>
</ul>
<p>The function is called by the renderer so it can reset the states after rendering this node. This makes the implementation of <a href="qsgrendernode.html#render">render</a>() simpler since it does not have to query and restore these states.</p>
<p>The default implementation returns 0, meaning no relevant state was changed in <a href="qsgrendernode.html#render">render</a>().</p>
<p>With APIs other than OpenGL the relevant states are only those that are set via the command list (for example, OMSetRenderTargets, RSSetViewports, RSSetScissorRects, OMSetBlendFactor, OMSetStencilRef in case of D3D12), and only when such commands were added to the scenegraph's command list queried via the QSGRendererInterface::CommandList resource enum. States set in pipeline state objects do not need to be reported here. Similarly, draw call related settings (root signature, descriptor heaps, etc.) are always set again by the scenegraph so <a href="qsgrendernode.html#render">render</a>() can freely change them.</p>
<p>The software backend exposes its <a href="../qtgui/qpainter.html">QPainter</a> and saves and restores before and after invoking <a href="qsgrendernode.html#render">render</a>(). Therefore reporting any changed states from here is not necessary.</p>
<p><b>Note: </b>This function may be called before <a href="qsgrendernode.html#render">render</a>().</p><!-- @@@changedStates -->
<!-- $$$clipList[overload1]$$$clipList -->
<h3 class="fn" id="clipList"><a name="clipList"></a>const <span class="type"><a href="qsgclipnode.html">QSGClipNode</a></span> *QSGRenderNode::<span class="name">clipList</span>() const</h3>
<p>Returns the current clip list.</p>
<!-- @@@clipList -->
<!-- $$$flags[overload1]$$$flags -->
<h3 class="fn" id="flags"><a name="flags"></a><code>[virtual] </code><span class="type"><a href="qsgrendernode.html#RenderingFlag-enum">QSGRenderNode::RenderingFlags</a></span> QSGRenderNode::<span class="name">flags</span>() const</h3>
<p>Returns flags describing the behavior of this render node.</p>
<p>The default implementation returns 0.</p>
<p><b>请参考 </b><a href="qsgrendernode.html#RenderingFlag-enum">RenderingFlag</a> 和 <a href="qsgrendernode.html#rect">rect</a>。).</p>
<!-- @@@flags -->
<!-- $$$inheritedOpacity[overload1]$$$inheritedOpacity -->
<h3 class="fn" id="inheritedOpacity"><a name="inheritedOpacity"></a><span class="type"><a href="../qtcore/qtglobal.html#qreal-typedef">qreal</a></span> QSGRenderNode::<span class="name">inheritedOpacity</span>() const</h3>
<p>Returns the current effective opacity.</p>
<!-- @@@inheritedOpacity -->
<!-- $$$matrix[overload1]$$$matrix -->
<h3 class="fn" id="matrix"><a name="matrix"></a>const <span class="type"><a href="../qtgui/qmatrix4x4.html">QMatrix4x4</a></span> *QSGRenderNode::<span class="name">matrix</span>() const</h3>
<p>Returns pointer to the current model-view matrix.</p>
<!-- @@@matrix -->
<!-- $$$rect[overload1]$$$rect -->
<h3 class="fn" id="rect"><a name="rect"></a><code>[virtual] </code><span class="type"><a href="../qtcore/qrectf.html">QRectF</a></span> QSGRenderNode::<span class="name">rect</span>() const</h3>
<p>Returns the bounding rectangle in item coordinates for the area <a href="qsgrendernode.html#render">render</a>() touches. The value is only in use when <a href="qsgrendernode.html#flags">flags</a>() includes <a href="qsgrendernode.html#RenderingFlag-enum">BoundedRectRendering</a>, ignored otherwise.</p>
<p>Reporting the rectangle in combination with <a href="qsgrendernode.html#RenderingFlag-enum">BoundedRectRendering</a> is particularly important with the <code>software</code> backend because otherwise having a rendernode in the scene would trigger fullscreen updates, skipping all partial update optimizations.</p>
<p>For rendernodes covering the entire area of a corresponding <a href="qquickitem.html">QQuickItem</a> the return value will be (0, 0, item-&gt;width(), item-&gt;height()).</p>
<p><b>Note: </b>Nodes are also free to render outside the boundaries specified by the item's width and height, since the scenegraph nodes are not bounded by the <a href="qquickitem.html">QQuickItem</a> geometry, as long as this is reported correctly from this function.</p><p><b>See also </b><a href="qsgrendernode.html#flags">flags</a>().</p>
<!-- @@@rect -->
<!-- $$$releaseResources[overload1]$$$releaseResources -->
<h3 class="fn" id="releaseResources"><a name="releaseResources"></a><code>[virtual] </code><span class="type">void</span> QSGRenderNode::<span class="name">releaseResources</span>()</h3>
<p>This function is called when all custom graphics resources allocated by this node have to be freed immediately. In case the node does not directly allocate graphics resources (buffers, textures, render targets, fences, etc.) through the graphics API that is in use, there is nothing to do here.</p>
<p>Failing to release all custom resources can lead to incorrect behavior in graphics device loss scenarios on some systems since subsequent reinitialization of the graphics system may fail.</p>
<p><b>Note: </b>Some scenegraph backends may choose not to call this function. Therefore it is expected that <a href="qsgrendernode.html">QSGRenderNode</a> implementations perform cleanup both in their destructor and in releaseResources().</p><p>Unlike with the destructor, it is expected that <a href="qsgrendernode.html#render">render</a>() can reinitialize all resources it needs when called after a call to releaseResources().</p>
<p>With OpenGL, the scenegraph's OpenGL context will be current both when calling the destructor and this function.</p>
<!-- @@@releaseResources -->
<!-- $$$render[overload1]$$$renderconstQSGRenderNode::RenderState* -->
<h3 class="fn" id="render"><a name="render"></a><code>[pure virtual] </code><span class="type">void</span> QSGRenderNode::<span class="name">render</span>(const <span class="type"><a href="qsgrendernode-renderstate.html">QSGRenderNode::RenderState</a></span> *<i>state</i>)</h3>
<p>This function is called by the renderer and should paint this node with directly invoking commands in the graphics API (OpenGL, Direct3D, etc.) currently in use.</p>
<p>The effective opacity can be retrieved with <a href="qsgrendernode.html#inheritedOpacity">inheritedOpacity</a>().</p>
<p>The projection matrix is available through <i>state</i>, while the model-view matrix can be fetched with <a href="qsgrendernode.html#matrix">matrix</a>(). The combined matrix is then the projection matrix times the model-view matrix. The correct stacking of the items in the scene is ensured by the projection matrix.</p>
<p>When using the provided matrices, the coordinate system for vertex data follows the usual <a href="qquickitem.html">QQuickItem</a> conventions: top-left is (0, 0), bottom-right is the corresponding <a href="qquickitem.html">QQuickItem</a>'s width() and height() minus one. For example, assuming a two float (x-y) per vertex coordinate layout, a triangle covering half of the item can be specified as (width - 1, height - 1), (0, 0), (0, height - 1) using counter-clockwise direction.</p>
<p><b>Note: </b><a href="qsgrendernode.html">QSGRenderNode</a> is provided as a means to implement custom 2D or 2.5D Qt Quick items. It is not intended for integrating true 3D content into the Qt Quick scene. That use case is better supported by <a href="qquickframebufferobject.html">QQuickFramebufferObject</a>, <a href="qquickwindow.html#beforeRendering">QQuickWindow::beforeRendering</a>(), or the equivalents of those for APIs other than OpenGL.</p><p>Clip information is calculated before the function is called, it is however not enabled. Implementations wishing to take clipping into account can set up scissoring or stencil based on the information in <i>state</i>. Some scenegraph backends, software in particular, use no scissor or stencil. There the clip region is provided as an ordinary <a href="../qtgui/qregion.html">QRegion</a>.</p>
<p>For OpenGL the following states are set on the render thread's context before this function is called:</p>
<ul>
<li>glDepthMask(false)</li>
<li>glDisable(GL_DEPTH_TEST)</li>
<li>glStencilFunc(GL_EQUAL, state.stencilValue, 0xff) depending on clip</li>
<li>glScissor(state.scissorRect.x(), state.scissorRect.y(), state.scissorRect.width(), state.scissorRect.height()) depending on clip</li>
<li>glEnable(GL_BLEND)</li>
<li>glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)</li>
<li>glDisable(GL_CULL_FACE)</li>
</ul>
<p>States that are not listed above, but are included in <a href="qsgrendernode.html#StateFlag-enum">StateFlags</a>, can have arbitrary values.</p>
<p><a href="qsgrendernode.html#changedStates">changedStates</a>() should return which states this function changes. If a state is not covered by <a href="qsgrendernode.html#StateFlag-enum">StateFlags</a>, the state should be set to the default value according to the OpenGL specification. For other APIs, see the documentation for <a href="qsgrendernode.html#changedStates">changedStates</a>() for more information.</p>
<p><b>Note: </b>Depth writes are disabled when this function is called (for example, glDepthMask(false) in case of OpenGL). Enabling depth writes can lead to unexpected results, depending on the scenegraph backend in use, so nodes should avoid this.</p><p>For APIs other than OpenGL, it will likely be necessary to query certain API-specific resources (for example, the graphics device or the command list/buffer to add the commands to). This is done via <a href="qsgrendererinterface.html">QSGRendererInterface</a>.</p>
<p><b>请参考 </b><a href="qsgrendererinterface.html">QSGRendererInterface</a> 和 <a href="qquickwindow.html#rendererInterface">QQuickWindow::rendererInterface</a>()。</p>
<!-- @@@render -->
</div>
        </div>
       </div>
   </div>
   </div>
</div>
<div class="footer">
   <p>
   <acronym title="Copyright">&copy;</acronym> 2019 The Qt Company Ltd.
   Documentation contributions included herein are the copyrights of
   their respective owners.<br/>    The documentation provided herein is licensed under the terms of the    <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation    License version 1.3</a> as published by the Free Software Foundation.<br/>    Qt and respective logos are trademarks of The Qt Company Ltd.     in Finland and/or other countries worldwide. All other trademarks are property
   of their respective owners. </p>
</div>
</body>
</html>
